#pragma once
#include <Rz/IObject.h>
#include <Rz/Collections/IEnumerable.h>
#include <Rz/ITypeWrapper.h>

namespace Rz { namespace Collections {

template <typename T>
class IList :
	virtual public IObject,
	virtual public IEnumerable<T>
{
	public:
		RZ_RTTI_INTERFACE(Rz, IList);
		RZ_RTTI_IMPLEMENTS(IObject, IEnumerable<T>);
		RZ_RTTI_TEMPLATES(NonObjectType<T>);
		RZ_RTTI_END;

		RZ_TYPEWRAPPER_IMPLEMENT(T);

		virtual ConstReference At(SizeType index) const = 0;
		virtual Reference At(SizeType index) = 0;

		virtual ConstReference operator [] (SizeType index) const = 0;
		virtual Reference operator [] (SizeType index) = 0;

		virtual SizeType GetCount() const = 0;
};

} }
